/*
 * Copyright (c) 2025 Industrial Software Feature Database
 */
package com.comac.ins.isfd.util;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;

import java.util.Arrays;

/**
 * 将JSON对象中的key 下划线 和 驼峰相互转换的小工具类
 *
 * @author hxloongs
 * @date 2024-7-17
 */
public class JsonKeyConverter {
    private final static String[] DO_NOT_COVERT_FIELD_LIST = {"_id"};

    /**
     * 将JSONObject中的所有key从下划线格式转换为驼峰格式。
     *
     * @param jsonObject 原始的JSONObject
     * @return 转换后的JSONObject
     */
    public static JSONObject snakeToCamel(JSONObject jsonObject) {
        JSONObject result = new JSONObject();
        for (String key : jsonObject.keySet()) {
            Object value = jsonObject.get(key);
            if (Arrays.stream(DO_NOT_COVERT_FIELD_LIST).toList().contains(key)) {
                result.put(key, value);
                continue;
            }
            if (value instanceof JSONObject) {
                // 递归处理嵌套的JSONObject
                result.put(StrUtil.toCamelCase(key), snakeToCamel((JSONObject) value));
            } else if (value instanceof JSONArray) {
                // 处理JSONArray中的JSONObject
                result.put(StrUtil.toCamelCase(key), convertArray((JSONArray) value));
            } else {
                result.put(StrUtil.toCamelCase(key), value);
            }
        }
        return result;
    }

    /**
     * 将JSONArray中的所有JSONObject的key从下划线格式转换为驼峰格式。
     *
     * @param jsonArray 原始的JSONArray
     * @return 转换后的JSONArray
     */
    private static JSONArray convertArray(JSONArray jsonArray) {
        JSONArray resultArray = new JSONArray();
        for (Object obj : jsonArray) {
            if (obj instanceof JSONObject) {
                resultArray.add(snakeToCamel((JSONObject) obj));
            } else {
                resultArray.add(obj);
            }
        }
        return resultArray;
    }

    /**
     * 将JSONObject中的所有key从驼峰格式转换为下划线格式。
     *
     * @param jsonObject 原始的JSONObject
     * @return 转换后的JSONObject
     */
    public static JSONObject camelToSnake(JSONObject jsonObject) {
        JSONObject result = new JSONObject();
        jsonObject.forEach((key, value) -> {
            if (value instanceof JSONObject) {
                // 递归处理嵌套的JSONObject
                result.put(StrUtil.toUnderlineCase(key), camelToSnake((JSONObject) value));
            } else if (value instanceof JSONArray) {
                // 处理JSONArray中的JSONObject
                result.put(StrUtil.toUnderlineCase(key), convertArraySnake((JSONArray) value));
            } else {
                result.put(StrUtil.toUnderlineCase(key), value);
            }
        });
        return result;
    }

    /**
     * 将JSONArray中的所有JSONObject的key从驼峰格式转换为下划线格式。
     *
     * @param jsonArray 原始的JSONArray
     * @return 转换后的JSONArray
     */
    private static JSONArray convertArraySnake(JSONArray jsonArray) {
        JSONArray resultArray = new JSONArray();
        for (Object obj : jsonArray) {
            if (obj instanceof JSONObject) {
                resultArray.add(camelToSnake((JSONObject) obj));
            } else {
                resultArray.add(obj);
            }
        }
        return resultArray;
    }
}
